/*
 *
 *      Author: Hernan.
 */

#include "Nodo.h"

	Nodo::Nodo(string str){

		this->dato= str;

	}

	Nodo::Nodo(string str,int i){

		this->dato= str;

		this->nroLinea = i;

	}


	string Nodo::getDato(){
		return this->dato;
	}

	string Nodo::getValor(){

		string str;

		if (this->dato[0]!='{' && this->dato[this->dato.length()]!='}'){
			size_t n=this->dato.find(":");
			str= this->dato.substr(n+1,this->dato.size()-1);
		}
		else{
			size_t n1=this->dato.find('{');
			str= this->dato.substr(n1+1,this->dato.size()-2);
		}

		return str;
	}


	string Nodo::getTipoDato(){
		if (this->dato[0]!='{' && this->dato[this->dato.length()]!='}'){
			size_t n=this->dato.find(":");
			string str= this->dato.substr(0,n);
			return str;
		}
		else return "*";
	}





	Nodo::Nodo(string str, list<Nodo*> lista){

		this->dato= str;
		this->listaNodos.assign(lista.begin(),lista.end());
	}



	list<Nodo*>* Nodo::obtenerLista(){

			return (&this->listaNodos);

	}



	void Nodo::agregarPtr(Nodo* ptr_nodo){

		this->listaNodos.insert(this->listaNodos.end(), ptr_nodo);

	}



	void Nodo::eliminarPtr(Nodo* nodo){

		this->listaNodos.remove(nodo);

	}



	void Nodo::imprimirInOrder(Nodo* nodo, string & s){
		if (nodo==NULL){

			return;
		}
		else if (nodo->listaNodos.empty()) s+=nodo->dato+'\n';
		else{
			s+=nodo->dato+"\n";
			list<Nodo*>::iterator it= nodo->listaNodos.begin();
			while(it!=nodo->listaNodos.end()){
				imprimirInOrder(*it,s);

				it++;
			}

		}

	}


	void Nodo::imprimirRecursivo(Nodo* nodo, stack<Nodo*> pila){
		if (nodo==NULL){

			return;
		}
		else{
			int tampila= (pila.size()*2);
			string str= nodo->dato;
			string shift(tampila,' ');
			cout<<shift<<str<<"   -nrolinea = "<<nodo->nroLinea<<endl;
			if (!nodo->listaNodos.empty()){
				pila.push(nodo);
				list<Nodo*>::iterator it= nodo->listaNodos.begin();
				while(it!=nodo->listaNodos.end()){
					imprimirRecursivo(*it,pila);
					it++;
				}
				pila.pop();
			}

		}
	}


	void Nodo::normalizar(){
		unsigned int i=0;
		while(i<this->dato.length()-1){
			if (this->dato[i]==' ' || this->dato[i]=='-' ) this->dato.erase(i,1);
			else i++;
		}
	}



	void Nodo::imprimir(){
		stack<Nodo*> s;
		this->imprimirRecursivo(this,s);
		//cout<<s<<endl;
	}


	int	Nodo::getNumeroDeLinea(){
		return this->nroLinea;
	}

Nodo::~Nodo() {
	// TODO TENGO PENDIENTE ESTO
}

